const BASE_URL = require('../config.js').BASE_URL;
const m = new Map();
/* 
说明：封装promise请求挂载到wx
内部方法：
  * get:get 请求
    使用方法：wx.$http.get(url,data)
    @param url String 不包括域名以及公共路径的路径
    @param data Object 请求参数
  * post:post 请求
    使用方法：wx.$http.post(url,data)
    @param url 同get
    @param data 同get
  * ajax:自定义请求方式
    使用方法：wx.$http.ajax(url, data, method)
    @param url 同get
    @param data 同get
    @param method String 请求方式
  * all:promise.all
*/
class axios {
  constructor() {
    this.header = ''
  }
  get(url, data, header) {
    return this.request({
      url: url,
      data: data,
      header: header || {},
      method: 'GET',
    })
  }
  post(url, data, header) {
    return this.request({
      url: url,
      data: data,
      header: header || {},
      method: 'POST',
    })
  }
  fetch(url, data, method, header) {
    return this.request({
      url: url,
      data: data,
      method: method,
      header: header
    })
  }
  all(task) {
    return Promise.all(task)
  }
  header(header) {
    this.header = header
  }
  request(obj) {

    let _this = this;
    let promise = new Promise((resolve, reject) => {
 
      if (!obj.url) reject({
        error: '地址不能为空'
      })
      _this.ajax(obj, resolve, reject)

    })
    return promise
  }
  ajax(obj, resolve, reject) {
    var _this = this;
    if (m.has(obj.url)){
      m.get(obj.url).abort()
    }
    m.set(obj.url,wx.request({
      url: BASE_URL + obj.url,
      data: obj.data || {},
      method: obj.method || 'GET',
      header: {
        token: getApp().globalData.token || '',
        'content-type': obj.header.contentType || 'application/json',
      },
      success: function (res) {
        if (['404', '503'].indexOf(res.data.status) != -1) {
          return
        }
        if (['200', '0'].indexOf(res.data.code) != -1) {
          m.delete(obj.url)
          resolve(res)
          return
        }
        if (res.data.code == '401') {
          // 重新登录
          if (res.data.msg) {
            wx.showToast({
              title: res.data.msg,
              icon: 'none'
            })
          }
          return
        }
        if (res.data.code == '500') {
          wx.showToast({
            icon: 'none'
          })
          reject(res)
          return
        }
        if (res.data.code == '40034') {
          reject(res)
          return
        }
        if (['100001', '100002'].indexOf(res.data.code) != -1) {
          reject(res)
          return
        }
        if (res.data.code == '100003') {
          reject(res)
          return
        }
        if (res.data.msg) {
          wx.showToast({
            title: res.data.msg,
            icon: 'none'
          })
        }
        reject(res)
      },
      fail: function (res) {
        if(res.errMsg.indexOf('abort')==-1){
          console.log('参数', obj.data, '地址', obj.url, '错误信息', res)
        }else{

        }
      },
      complete: function (res) { }
    }))
  }
}

wx.$http = new axios()
wx.$upload = function (url, obj) {
  return new Promise((resolve, reject) => {
    console.log(obj.param)
    wx.uploadFile({
      url: BASE_URL + url,
      filePath: obj.filePath,
      name: 'file',
      header: {
        token: getApp().globalData.token || '',
        'content-type': 'multipart/form-data',
        // 'content-type': 'application/json'
      },
      formData: obj.param,
      success(res) {
        console.log(res)
        res.data = JSON.parse(res.data)
        if (res.data.code == '200') {
          resolve(res.data.data)
        } else {
          wx.showToast({
            title: res.data.msg,
            icon:'none'
          })
          reject(res.data.data)
        }
      },
      fail(res) {
        reject(res)
      }
    })
  })
}
